পাইথনের Pdb ডিবাগারের পূর্ণ সম্ভাবনা উন্মোচন করুন। ইন্টারঅ্যাক্টিভ ডিবাগিং কৌশল, প্রয়োজনীয় কমান্ড ও সেরা অনুশীলন শিখুন আপনার কোডের সমস্যা দক্ষতার সাথে চিহ্নিত ও সমাধানে, বিশ্বের যেকোনো স্থানে। সকল পাইথন পেশাদারদের জন্য একটি সম্পূর্ণ নির্দেশিকা।
Pdb ডিবাগার: বিশ্বব্যাপী ডেভেলপারদের জন্য পাইথনে ইন্টারঅ্যাক্টিভ ডিবাগিং কৌশল আয়ত্ত করা
সফটওয়্যার ডেভেলপমেন্টের বিশাল এবং আন্তঃসংযুক্ত বিশ্বে, যেখানে পাইথন ওয়েব অ্যাপ্লিকেশন থেকে শুরু করে মেশিন লার্নিং মডেল পর্যন্ত সবকিছুকে শক্তি যোগায়, সেখানে দক্ষতার সাথে সমস্যাগুলি চিহ্নিত ও সমাধান করার ক্ষমতা অত্যন্ত গুরুত্বপূর্ণ। আপনার ভৌগোলিক অবস্থান বা পেশাদার পটভূমি নির্বিশেষে, ডিবাগিং একটি সর্বজনীন দক্ষতা যা দক্ষ ডেভেলপারদের সংগ্রামকারী ডেভেলপারদের থেকে আলাদা করে তোলে। যদিও সাধারণ print()
স্টেটমেন্ট তার উদ্দেশ্য পূরণ করে, পাইথনের বিল্ট-ইন ইন্টারঅ্যাক্টিভ ডিবাগার, Pdb, আপনার কোড বোঝা এবং ঠিক করার জন্য একটি উল্লেখযোগ্যভাবে আরও শক্তিশালী এবং সূক্ষ্ম পদ্ধতি সরবরাহ করে।
এই ব্যাপক নির্দেশিকা আপনাকে Pdb এর মধ্য দিয়ে একটি যাত্রায় নিয়ে যাবে, আপনার পাইথন অ্যাপ্লিকেশনগুলি ইন্টারঅ্যাক্টিভভাবে ডিবাগ করার জন্য প্রয়োজনীয় জ্ঞান এবং ব্যবহারিক কৌশল দিয়ে আপনাকে সজ্জিত করবে। আমরা মৌলিক আহ্বান থেকে শুরু করে উন্নত ব্রেকপয়েন্ট ব্যবস্থাপনা পর্যন্ত সবকিছু অন্বেষণ করব, যাতে আপনার প্রকল্পের জটিলতা বা স্কেল যাই হোক না কেন, আপনি আত্মবিশ্বাসের সাথে বাগগুলি মোকাবেলা করতে পারেন।
ডিবাগিংয়ের সর্বজনীন প্রয়োজনীয়তা: সাধারণ প্রিন্ট স্টেটমেন্টের বাইরে
লন্ডন থেকে লাগোস পর্যন্ত, সিডনি থেকে সাও পাওলো পর্যন্ত প্রতিটি ডেভেলপারই তাদের কোডে অপ্রত্যাশিত আচরণ দেখলে হতাশ হন। প্রাথমিক প্রতিক্রিয়া প্রায়শই সন্দেহজনক সমস্যাযুক্ত এলাকায় print()
স্টেটমেন্ট ছড়িয়ে দেওয়া হয় যাতে ভেরিয়েবলের মানগুলি পরীক্ষা করা যায়। যদিও এই পদ্ধতিটি কখনও কখনও একটি সমাধানের দিকে নিয়ে যেতে পারে, এর উল্লেখযোগ্য অসুবিধা রয়েছে:
- নমনীয়তার অভাব: প্রতিবার আপনি যখন একটি নতুন ভেরিয়েবল পরীক্ষা করতে বা একটি ভিন্ন এক্সিকিউশন পাথ ট্রেস করতে চান, তখন আপনাকে আপনার কোড পরিবর্তন করতে এবং স্ক্রিপ্টটি পুনরায় চালাতে হবে।
- অগোছালো: আপনার কোডবেস অস্থায়ী ডিবাগ প্রিন্ট দিয়ে ভরে যায়, যা স্থাপন করার আগে সাবধানে সরাতে হবে।
- সীমিত অন্তর্দৃষ্টি: প্রিন্ট স্টেটমেন্ট আপনাকে একটি স্ন্যাপশট দেখায়, কিন্তু তারা আপনাকে গতিশীলভাবে ভেরিয়েবল পরিবর্তন করতে, ফাংশনে প্রবেশ করতে বা পুনরায় এক্সিকিউশন না করে সম্পূর্ণ এক্সিকিউশন কনটেক্সট অন্বেষণ করতে দেয় না।
Pdb এই সীমাবদ্ধতাগুলি সমাধান করে একটি ইন্টারঅ্যাক্টিভ পরিবেশ সরবরাহ করে যেখানে আপনি আপনার প্রোগ্রামের এক্সিকিউশন বিরতি দিতে পারেন, এর অবস্থা পরীক্ষা করতে পারেন, লাইন বাই লাইন কোডের মধ্য দিয়ে যেতে পারেন, ভেরিয়েবল পরিবর্তন করতে পারেন এবং এমনকি নির্বিচারে পাইথন কমান্ড এক্সিকিউট করতে পারেন, সবই আপনার স্ক্রিপ্ট পুনরায় চালু না করে। জটিল লজিক ফ্লো বোঝা এবং অধরা বাগগুলির মূল কারণ চিহ্নিত করার জন্য এই স্তরের নিয়ন্ত্রণ এবং অন্তর্দৃষ্টি অমূল্য।
Pdb দিয়ে শুরু করা: আহ্বান পদ্ধতি
Pdb ডিবাগার আহ্বান করার বেশ কয়েকটি উপায় রয়েছে, প্রতিটি বিভিন্ন ডিবাগিং পরিস্থিতির জন্য উপযুক্ত। এই পদ্ধতিগুলি বোঝা Pdb এর শক্তিকে কাজে লাগানোর প্রথম পদক্ষেপ।
1. কমান্ড লাইন থেকে আহ্বান: দ্রুত এবং বিশ্বব্যাপী প্রবেশ
আপনি সরাসরি চালান এমন স্ক্রিপ্টগুলির জন্য, -m
ফ্ল্যাগ ব্যবহার করে কমান্ড লাইন থেকে Pdb আহ্বান করা যেতে পারে। এটি ডিবাগারের নিয়ন্ত্রণে আপনার স্ক্রিপ্ট শুরু করে, একেবারে প্রথম এক্সিকিউটেবল লাইনে এক্সিকিউশন বিরতি দেয়।
সিনট্যাক্স:
python -m pdb your_script.py
আসুন একটি সাধারণ পাইথন স্ক্রিপ্ট, my_application.py
বিবেচনা করি:
# my_application.py
def generate_greeting(name):
prefix = "Hello, "
full_message = prefix + name + "!"
return full_message
if __name__ == "__main__":
user_name = "Global Developer"
greeting = generate_greeting(user_name)
print(greeting)
কমান্ড লাইন থেকে এটি ডিবাগ করতে, আপনার টার্মিনালে my_application.py
ধারণকারী ডিরেক্টরিতে নেভিগেট করুন:
$ python -m pdb my_application.py
> /path/to/my_application.py(3)generate_greeting()->None
(Pdb)
আপনি লক্ষ্য করবেন প্রম্পট (Pdb)
এ পরিবর্তিত হয়েছে, যা নির্দেশ করে যে আপনি এখন ডিবাগারের ভিতরে আছেন। আউটপুট বর্তমান ফাইল এবং লাইন নম্বর দেখায় যেখানে এক্সিকিউশন বিরতি দেওয়া হয়েছে (এই ক্ষেত্রে, লাইন 3, generate_greeting
ফাংশনের শুরু)। এখান থেকে, আপনি Pdb কমান্ড ইস্যু করা শুরু করতে পারেন।
2. আপনার কোডের মধ্যে একটি ট্রেসপয়েন্ট সেট করা: কৌশলগত বিরতি
এটি সম্ভবত Pdb ব্যবহার করার সবচেয়ে সাধারণ এবং নমনীয় উপায়। আপনার কোডের যেকোনো পয়েন্টে import pdb; pdb.set_trace()
সন্নিবেশ করে, আপনি পাইথনকে সেই লাইনে এক্সিকিউশন বিরতি দিতে এবং Pdb ইন্টারঅ্যাক্টিভ প্রম্পটে প্রবেশ করতে নির্দেশ দেন।
সিনট্যাক্স:
import pdb
pdb.set_trace()
এই পদ্ধতিটি আদর্শ যখন আপনার কোডের একটি নির্দিষ্ট অংশ আছে যা আপনি সমস্যাযুক্ত বলে সন্দেহ করেন, অথবা যখন আপনি শুধুমাত্র আপনার অ্যাপ্লিকেশনের লজিকের গভীরে কল করা একটি ফাংশন ডিবাগ করতে চান। আপনার প্রোগ্রামটি স্বাভাবিকভাবে চলবে যতক্ষণ না এটি pdb.set_trace()
লাইনে আঘাত করে, একটি সুনির্দিষ্ট এন্ট্রি পয়েন্ট সরবরাহ করে।
উদাহরণ:
import pdb
def calculate_discount(price, discount_percentage):
if not (0 <= discount_percentage <= 100):
print("Invalid discount percentage.")
pdb.set_trace() # Pause here if discount is invalid
return price # Return original price if invalid
discount_amount = price * (discount_percentage / 100)
final_price = price - discount_amount
return final_price
item_price = 200
discount_value = 110 # This will trigger the debugger
final = calculate_discount(item_price, discount_value)
print(f"Final price after discount: {final}")
আপনি যখন এই স্ক্রিপ্টটি চালান, তখন এটি "Invalid discount percentage." প্রিন্ট করবে এবং তারপর pdb.set_trace()
লাইনে Pdb প্রম্পটে প্রবেশ করবে, যা আপনাকে সেই নির্দিষ্ট কনটেক্সটে price
, discount_percentage
, এবং অন্যান্য ভেরিয়েবল পরীক্ষা করতে দেবে।
আপনার কোড নেভিগেট করার জন্য প্রয়োজনীয় Pdb কমান্ড
একবার Pdb প্রম্পটের ভিতরে, শক্তিশালী কমান্ডগুলির একটি সেট আপনার কাছে উপলব্ধ হয়। কার্যকর ইন্টারঅ্যাক্টিভ ডিবাগিংয়ের জন্য এগুলি আয়ত্ত করা অত্যন্ত গুরুত্বপূর্ণ। অনেক কমান্ডের সংক্ষিপ্ত উপনাম রয়েছে, যা দ্রুততার জন্য সাধারণত ব্যবহৃত হয়।
-
h
orhelp [command]
: সাহায্য পানPdb এর সকল কমান্ডের একটি তালিকা প্রদান করে। যদি আপনি একটি কমান্ড নির্দিষ্ট করেন, তাহলে এটি সেই নির্দিষ্ট কমান্ডের জন্য বিস্তারিত সাহায্য প্রদান করে (যেমন,
h n
)। -
n
ornext
: ওভার স্টেপ করুনবর্তমান লাইনটি এক্সিকিউট করে এবং বর্তমান ফাংশনের মধ্যে পরবর্তী এক্সিকিউটেবল লাইনে থামে। যদি বর্তমান লাইনটি একটি ফাংশন কল হয়, তাহলে
n
পুরো ফাংশনটি এক্সিকিউট করবে এবং ফাংশন কলের ঠিক পরের লাইনে থামবে। -
s
orstep
: ইনটু স্টেপ করুনবর্তমান লাইনটি এক্সিকিউট করে। যদি বর্তমান লাইনটি একটি ফাংশন কল হয়, তাহলে
s
সেই ফাংশনে প্রবেশ করবে, এর প্রথম এক্সিকিউটেবল লাইনে বিরতি দেবে। যদি এটি একটি ফাংশন কল না হয়, তবে এটিn
এর মতো আচরণ করে। -
c
orcontinue
: এক্সিকিউশন চালিয়ে যানপ্রোগ্রামের এক্সিকিউশন স্বাভাবিকভাবে আবার শুরু করে যতক্ষণ না পরবর্তী ব্রেকপয়েন্ট পাওয়া যায় বা প্রোগ্রাম শেষ হয়।
-
q
orquit
: ডিবাগার থেকে প্রস্থান করুনডিবাগার সেশন বাতিল করে এবং চলমান প্রোগ্রাম অবিলম্বে বন্ধ করে দেয়।
-
l
orlist [first, last]
: সোর্স কোড তালিকাভুক্ত করুনএক্সিকিউশনের বর্তমান লাইনের আশেপাশে সোর্স কোড দেখায় (সাধারণত 11 লাইন, 5টি আগে এবং 5টি পরে)। আপনি একটি রেঞ্জ নির্দিষ্ট করতে পারেন (যেমন,
l 10,20
) অথবা একটি নির্দিষ্ট লাইন নম্বর (যেমন,l 15
)। -
a
orargs
: ফাংশন আর্গুমেন্ট দেখানবর্তমান ফাংশনের আর্গুমেন্ট (এবং তাদের মান) প্রিন্ট করে।
-
w
orwhere
/bt
orbacktrace
: স্ট্যাক ট্রেস দেখানকল স্ট্যাক প্রিন্ট করে (ফাংশন কলের ক্রম যা এক্সিকিউশনের বর্তমান বিন্দুতে নিয়ে গেছে)। এটি আপনি কিভাবে কোডের একটি নির্দিষ্ট লাইনে এসেছেন তা বোঝার জন্য অবিশ্বাস্যভাবে কার্যকর।
-
p <expression>
orprint <expression>
: মূল্যায়ন এবং প্রিন্ট করুনবর্তমান কনটেক্সটে একটি পাইথন এক্সপ্রেশন মূল্যায়ন করে এবং এর মান প্রিন্ট করে। আপনি ভেরিয়েবল পরীক্ষা করতে পারেন (যেমন,
p my_variable
), গণনা করতে পারেন (যেমন,p x + y
), অথবা ফাংশন কল করতে পারেন (যেমন,p some_function()
)। -
pp <expression>
orpprint <expression>
: সুন্দরভাবে প্রিন্ট করুনp
এর অনুরূপ, তবে আরও পঠনযোগ্য আউটপুটের জন্যpprint
মডিউল ব্যবহার করে, বিশেষ করে ডিকশনারি বা তালিকার মতো জটিল ডেটা স্ট্রাকচারের জন্য। -
r
orreturn
: ফাংশন রিটার্ন পর্যন্ত চালিয়ে যানবর্তমান ফাংশনটি রিটার্ন না করা পর্যন্ত এক্সিকিউশন চালিয়ে যায়। এটি তখন কার্যকর যখন আপনি একটি ফাংশনে প্রবেশ করেছেন এবং প্রতিটি লাইনের মধ্য দিয়ে না গিয়ে দ্রুত এর শেষে যেতে চান।
-
j <line_number>
orjump <line_number>
: লাইনে ঝাঁপ দিনআপনাকে বর্তমান ফ্রেমে একটি ভিন্ন লাইন নম্বরে ঝাঁপ দিতে দেয়। অত্যন্ত সতর্কতার সাথে ব্যবহার করুন, কারণ ঝাঁপ দিলে গুরুত্বপূর্ণ কোড বাইপাস হতে পারে বা অপ্রত্যাশিত প্রোগ্রাম অবস্থার সৃষ্টি হতে পারে। এটি একটি ছোট অংশ পুনরায় এক্সিকিউট করার জন্য বা একটি পরিচিত ভাল অংশ এড়িয়ে যাওয়ার জন্য সবচেয়ে ভাল ব্যবহৃত হয়।
-
! <statement>
: পাইথন স্টেটমেন্ট এক্সিকিউট করুনবর্তমান কনটেক্সটে যেকোনো পাইথন স্টেটমেন্ট এক্সিকিউট করে। এটি অবিশ্বাস্যভাবে শক্তিশালী: আপনি ভেরিয়েবলের মান পরিবর্তন করতে পারেন (যেমন,
!my_var = 100
), মেথড কল করতে পারেন, অথবা উড়তে থাকা মডিউল ইম্পোর্ট করতে পারেন। এটি ডিবাগিংয়ের সময় গতিশীল অবস্থা ম্যানিপুলেশন সক্ষম করে।
ব্যবহারিক উদাহরণ: প্রয়োজনীয় কমান্ড দিয়ে একটি বাগ ট্রেস করা
আসুন একটি পরিস্থিতি বিবেচনা করি যেখানে একটি ডেটা প্রসেসিং ফাংশন প্রত্যাশিত ফলাফল দিচ্ছে না। আমরা লজিক্যাল ত্রুটি সনাক্ত করতে Pdb ব্যবহার করব।
# data_processor.py
def process_records(record_list):
active_count = 0
processed_values = []
for record in record_list:
if record["status"] == "active":
active_count += 1
# Bug: Should be `record["value"] * 2`, not `+ 2`
processed_values.append(record["value"] + 2)
else:
# Simulate some logging
print(f"Skipping inactive record: {record['id']}")
return active_count, processed_values
if __name__ == "__main__":
dataset = [
{"id": "A1", "status": "active", "value": 10},
{"id": "B2", "status": "inactive", "value": 5},
{"id": "C3", "status": "active", "value": 20},
{"id": "D4", "status": "active", "value": 15}
]
print("Starting data processing...")
# Insert pdb.set_trace() to start debugging here
import pdb; pdb.set_trace()
total_active, transformed_data = process_records(dataset)
print(f"Total active records: {total_active}")
print(f"Transformed values: {transformed_data}")
print("Processing complete.")
এই স্ক্রিপ্টটি চালালে আপনি লাইন 24 এ Pdb প্রম্পটে আসবেন। আসুন ডিবাগ করি:
$ python data_processor.py
Starting data processing...
> /path/to/data_processor.py(24)<module>()->None
(Pdb) <b>n</b> # Execute line 24, moving to the function call
> /path/to/data_processor.py(25)<module>()->None
(Pdb) <b>s</b> # Step INTO the process_records function
> /path/to/data_processor.py(4)process_records(record_list=['A1', 'B2', 'C3', 'D4'])->None
(Pdb) <b>l</b> # List source code to see where we are
1 def process_records(record_list):
2 active_count = 0
3 processed_values = []
4 -> for record in record_list:
5 if record["status"] == "active":
6 active_count += 1
7 # Bug: Should be `record["value"] * 2`, not `+ 2`
8 processed_values.append(record["value"] + 2)
9 else:
10 # Simulate some logging
11 print(f"Skipping inactive record: {record['id']}")
(Pdb) <b>n</b> # Move to the first line inside the loop
> /path/to/data_processor.py(5)process_records()->None
(Pdb) <b>p record</b> # Inspect the current record
{'id': 'A1', 'status': 'active', 'value': 10}
(Pdb) <b>n</b> # Move to the if condition
> /path/to/data_processor.py(6)process_records()->None
(Pdb) <b>n</b> # Increment active_count
> /path/to/data_processor.py(8)process_records()->None
(Pdb) <b>p active_count</b> # Check active_count
1
(Pdb) <b>p record["value"]</b> # Check the value before addition
10
(Pdb) <b>n</b> # Execute the append line
> /path/to/data_processor.py(4)process_records()->None
(Pdb) <b>p processed_values</b> # Check the processed_values list
[12]
আহ, [12]
যখন আমরা [20]
প্রত্যাশা করছিলাম (কারণ 10 * 2 = 20)। এটি অবিলম্বে লাইন 8 এ সমস্যাটি তুলে ধরে যেখানে record["value"] + 2
ব্যবহার করা হয়েছে record["value"] * 2
এর পরিবর্তে। আমরা বাগটি খুঁজে পেয়েছি! এখন আমরা Pdb (`q`) ছেড়ে কোডটি ঠিক করতে পারি।
আপনার নিয়ন্ত্রণ আয়ত্ত করুন: ব্রেকপয়েন্ট এবং শর্তসাপেক্ষ এক্সিকিউশন
যদিও pdb.set_trace()
প্রাথমিক প্রবেশের জন্য দুর্দান্ত, Pdb এর ব্রেকপয়েন্ট ক্ষমতা প্রোগ্রামের ফ্লোর উপর আরও পরিশীলিত নিয়ন্ত্রণ প্রদান করে, বিশেষ করে বড় অ্যাপ্লিকেশনগুলিতে বা নির্দিষ্ট শর্ত ডিবাগ করার সময়।
ব্রেকপয়েন্ট সেট করা (b
বা break
)
ব্রেকপয়েন্ট ডিবাগারকে নির্দিষ্ট লাইন বা ফাংশন এন্ট্রিতে এক্সিকিউশন বিরতি দিতে নির্দেশ দেয়। আপনি Pdb সেশনের মধ্যে ইন্টারঅ্যাক্টিভভাবে এগুলি সেট করতে পারেন।
-
b <line_number>
: বর্তমান ফাইলে একটি নির্দিষ্ট লাইনে একটি ব্রেকপয়েন্ট সেট করুন। যেমন,b 15
। -
b <file>:<line_number>
: অন্য ফাইলে একটি ব্রেকপয়েন্ট সেট করুন। যেমন,b helpers.py:42
। -
b <function_name>
: একটি ফাংশনের প্রথম এক্সিকিউটেবল লাইনে একটি ব্রেকপয়েন্ট সেট করুন। যেমন,b process_data
।
(Pdb) <b>b 8</b> # Set a breakpoint at line 8 in data_processor.py
Breakpoint 1 at /path/to/data_processor.py:8
(Pdb) <b>c</b> # Continue execution. It will now stop at the breakpoint.
> /path/to/data_processor.py(8)process_records()->None
(Pdb)
ব্রেকপয়েন্ট পরিচালনা করা (cl
, disable
, enable
, tbreak
)
আপনি যত বেশি ব্রেকপয়েন্ট যোগ করবেন, সেগুলি পরিচালনা করার উপায় আপনার প্রয়োজন হবে।
-
b
(আর্গুমেন্ট ছাড়া): বর্তমানে সেট করা সমস্ত ব্রেকপয়েন্ট তালিকাভুক্ত করে, তাদের সংখ্যা, ফাইল/লাইন এবং হিট কাউন্ট সহ।(Pdb) <b>b</b> Num Type Disp Enb Where 1 breakpoint keep yes at /path/to/data_processor.py:8
-
cl
বাclear
: ব্রেকপয়েন্ট সাফ করে।cl
: সমস্ত ব্রেকপয়েন্ট সাফ করার জন্য নিশ্চিতকরণ চায়।cl <breakpoint_number>
: একটি নির্দিষ্ট ব্রেকপয়েন্ট সাফ করে (যেমন,cl 1
)।cl <file>:<line_number>
: অবস্থান দ্বারা একটি ব্রেকপয়েন্ট সাফ করে।
-
disable <breakpoint_number>
: একটি ব্রেকপয়েন্ট না সরিয়ে সাময়িকভাবে অক্ষম করে। ডিবাগার এটি উপেক্ষা করবে। -
enable <breakpoint_number>
: পূর্বে অক্ষম করা একটি ব্রেকপয়েন্ট পুনরায় সক্ষম করে। -
tbreak <line_number>
: একটি অস্থায়ী ব্রেকপয়েন্ট সেট করে। এটি একটি নিয়মিত ব্রেকপয়েন্টের মতো আচরণ করে তবে এটি প্রথমবার আঘাত করার পরে স্বয়ংক্রিয়ভাবে সাফ হয়ে যায়। এককালীন পরিদর্শনের জন্য দরকারী।
শর্তসাপেক্ষ ব্রেকপয়েন্ট (condition
, ignore
)
কখনও কখনও আপনি শুধুমাত্র একটি নির্দিষ্ট শর্ত পূরণ হলে একটি ব্রেকপয়েন্টে থামতে চান। লুপ, বড় ডেটাসেট বা নির্দিষ্ট এজ কেস ডিবাগ করার সময় এটি অমূল্য।
-
condition <breakpoint_number> <expression>
: একটি ব্রেকপয়েন্টকে শর্তসাপেক্ষ করে। ডিবাগার কেবল তখনই থামবে যদি প্রদত্ত পাইথন<expression>
True
মূল্যায়ন করে।উদাহরণ: আমাদের
data_processor.py
এ, আমরা যদি শুধুমাত্রrecord["value"]
10 এর বেশি হলে থামতে চাই তাহলে কী হবে?(Pdb) <b>b 8</b> # Set a breakpoint at the line of interest Breakpoint 1 at /path/to/data_processor.py:8 (Pdb) <b>condition 1 record["value"] > 10</b> # Make breakpoint 1 conditional (Pdb) <b>c</b> # Continue. It will stop only for records with value > 10. > /path/to/data_processor.py(8)process_records()->None (Pdb) <b>p record["value"]</b> 20 (Pdb) <b>c</b> # Continue again, it will skip value=15 record because our bug is fixed (assuming) > /path/to/data_processor.py(8)process_records()->None (Pdb) <b>p record["value"]</b> 15
একটি শর্ত সাফ করতে, একটি এক্সপ্রেশন ছাড়া
condition <breakpoint_number>
ব্যবহার করুন। -
ignore <breakpoint_number> <count>
: একটি ব্রেকপয়েন্ট এক্সিকিউশন বিরতি দেওয়ার আগে কতবার উপেক্ষা করা উচিত তা নির্দিষ্ট করে। একটি লুপের প্রাথমিক পুনরাবৃত্তিগুলি এড়িয়ে যাওয়ার জন্য দরকারী।উদাহরণ: ব্রেকপয়েন্ট 1 এ থামতে শুধুমাত্র এটি 3 বার আঘাত করার পরে:
(Pdb) <b>ignore 1 3</b> (Pdb) <b>c</b>
উন্নত Pdb কৌশল এবং সর্বোত্তম অনুশীলন
মূল কমান্ডগুলির বাইরে, Pdb এমন কার্যকারিতা সরবরাহ করে যা আপনার ডিবাগিং ক্ষমতাকে উন্নত করে, এবং নির্দিষ্ট অনুশীলন গ্রহণ করলে আপনার দক্ষতা উল্লেখযোগ্যভাবে বাড়তে পারে।
পোস্ট-মর্টেম ডিবাগিং: ব্যতিক্রমগুলি তদন্ত করা
Pdb এর সবচেয়ে শক্তিশালী বৈশিষ্ট্যগুলির মধ্যে একটি হল পোস্ট-মর্টেম ডিবাগিং করার ক্ষমতা। যখন আপনার প্রোগ্রামে একটি অপ্রত্যাশিত ব্যতিক্রম ঘটে, তখন Pdb ব্যবহার করে ব্যতিক্রমটি উত্থাপিত হয়েছিল এমন বিন্দুতে ডিবাগারে প্রবেশ করা যেতে পারে, যা আপনাকে ব্যর্থতার ঠিক মুহূর্তে প্রোগ্রামের অবস্থা পরীক্ষা করতে দেয়।
পদ্ধতি 1: একটি অপ্রত্যাশিত ব্যতিক্রমের উপর Pdb আহ্বান করা
Pdb এর সাথে আপনার স্ক্রিপ্ট চালান, একটি ত্রুটি না হওয়া পর্যন্ত চালিয়ে যেতে নির্দেশ দিন:
python -m pdb -c continue your_script.py
যদি একটি ব্যতিক্রম উত্থাপিত হয়, Pdb স্বয়ংক্রিয়ভাবে আপনাকে ডিবাগারের মধ্যে সেই লাইনে ফেলে দেবে যেখানে এটি ঘটেছে। The -c continue
অংশটি Pdb কে বলে যে স্ক্রিপ্টটি একটি ত্রুটি বা ব্রেকপয়েন্টে না পৌঁছানো পর্যন্ত চালাও, একেবারে শুরুতে না থেমে।
পদ্ধতি 2: একটি ব্যতিক্রম হ্যান্ডেলারের মধ্যে pdb.pm()
ব্যবহার করা
যদি আপনার একটি except
ব্লক থাকে যা ব্যতিক্রমগুলি ধরে, তবে আপনি একটি ব্যতিক্রম ধরার ঠিক পরে ডিবাগারে প্রবেশ করতে স্পষ্টভাবে pdb.pm()
("পোস্ট-মর্টেম" এর জন্য) কল করতে পারেন।
উদাহরণ:
def divide(numerator, denominator):
return numerator / denominator
if __name__ == "__main__":
x = 10
y = 0 # This will cause a ZeroDivisionError
try:
result = divide(x, y)
print(f"Division result: {result}")
except ZeroDivisionError:
print("Error: Cannot divide by zero. Entering post-mortem debugger...")
import pdb; pdb.pm() # Debugger entry point after exception
except Exception as e:
print(f"An unexpected error occurred: {e}")
আপনি যখন এটি চালান, "Error: Cannot divide by zero..." বার্তার পরে, Pdb চালু হবে, যা আপনাকে ZeroDivisionError
ঘটার ঠিক আগে numerator
, denominator
এবং কল স্ট্যাক পরীক্ষা করতে দেবে।
প্রোগ্রামের অবস্থার সাথে ইন্টারঅ্যাক্ট করা: !
এর ক্ষমতা
The !
কমান্ড (অথবা কেবল একটি পাইথন এক্সপ্রেশন টাইপ করা যা Pdb কমান্ডের সাথে সংঘর্ষ করে না) ব্যতিক্রমীভাবে শক্তিশালী। এটি আপনাকে বর্তমান প্রোগ্রামের কনটেক্সটে নির্বিচারে পাইথন কোড এক্সিকিউট করতে দেয়।
-
ভেরিয়েবল পরিবর্তন করা: যদি আপনি সন্দেহ করেন যে একটি ভেরিয়েবলের ভুল মান রয়েছে, তাহলে আপনি প্রোগ্রামটি পুনরায় চালু না করে একটি অনুমান পরীক্ষা করার জন্য তা ফ্লাইতে পরিবর্তন করতে পারেন। যেমন,
!my_value = 50
। -
ফাংশন/মেথড কল করা: আপনি আপনার প্রোগ্রামের অন্যান্য ফাংশন বা অবজেক্টের মেথড কল করতে পারেন তাদের আচরণ পরীক্ষা করতে বা অতিরিক্ত তথ্য পুনরুদ্ধার করতে। যেমন,
!my_object.debug_info()
। -
মডিউল ইম্পোর্ট করা: দ্রুত চেকের জন্য একটি মডিউল দরকার? যেমন,
!import math; print(math.sqrt(16))
।
এই গতিশীল ইন্টারঅ্যাকশন কার্যকর ইন্টারঅ্যাক্টিভ ডিবাগিংয়ের একটি ভিত্তিপ্রস্তর, যা দ্রুত পরিস্থিতি পরীক্ষা করার জন্য অভূতপূর্ব নমনীয়তা সরবরাহ করে।
Pdb কাস্টমাইজ করা এবং বিকল্পগুলি বিবেচনা করা
-
The
.pdbrc
ফাইল: পুনরাবৃত্ত সেটআপের জন্য (যেমন, সর্বদা 11 লাইনের পরিবর্তে 20 লাইন তালিকাভুক্ত করা, বা নির্দিষ্ট উপনাম সেট করা), Pdb আপনার হোম ডিরেক্টরিতে একটি.pdbrc
ফাইল খোঁজে। আপনি এই ফাইলে Pdb কমান্ড রাখতে পারেন, এবং ডিবাগার চালু হওয়ার পরে সেগুলি এক্সিকিউট হবে। এটি আপনার ডিবাগিং পরিবেশ ব্যক্তিগতকৃত করার একটি শক্তিশালী উপায়। -
উন্নত Pdb বিকল্প: যদিও Pdb শক্তিশালী, বেশ কয়েকটি তৃতীয় পক্ষের লাইব্রেরি উন্নত বৈশিষ্ট্য সরবরাহ করে যা Pdb এর মূল কার্যকারিতার উপর ভিত্তি করে তৈরি হয়েছে:
ipdb
: IPython এর সাথে Pdb কে একীভূত করে, যা ট্যাব-কমপ্লিশন, সিনট্যাক্স হাইলাইটিং এবং আরও ভাল ট্রেসব্যাকের মতো বৈশিষ্ট্য সরবরাহ করে। IPython/Jupyter ব্যবহারকারীদের জন্য অত্যন্ত প্রস্তাবিত।pdbpp
:ipdb
এর অনুরূপ উন্নতি প্রদান করে তবে সোর্স কোড হাইলাইটিং, আরও ভাল ট্রেসব্যাক ফরম্যাটিং এবং কমপ্লিশনের মতো বৈশিষ্ট্য সহ ভ্যানিলা Pdb অভিজ্ঞতা উন্নত করার উপর মনোযোগ দেয়।
এই বিকল্পগুলি
pip
এর মাধ্যমে ইনস্টল করা হয় (যেমন,pip install ipdb
) এবং প্রায়শইimport pdb; pdb.set_trace()
কেimport ipdb; ipdb.set_trace()
দিয়ে প্রতিস্থাপন করে ব্যবহার করা যেতে পারে। -
IDE ইন্টিগ্রেশন: VS Code, PyCharm, বা পাইথন প্লাগইন সহ Sublime Text এর মতো বেশিরভাগ আধুনিক ইন্টিগ্রেটেড ডেভেলপমেন্ট এনভায়রনমেন্ট (IDEs) পরিশীলিত গ্রাফিক্যাল ডিবাগিং ইন্টারফেস সরবরাহ করে। এগুলি প্রায়শই Pdb (বা অনুরূপ অন্তর্নিহিত প্রক্রিয়া) ব্যবহার করে তবে স্টেপিং, ব্রেকপয়েন্ট সেট করা এবং ভেরিয়েবল পরীক্ষা করার জন্য ভিজ্যুয়াল নিয়ন্ত্রণ সহ কমান্ড-লাইন ইন্টারফেসকে বিমূর্ত করে। সুবিধাজনক হলেও, Pdb এর কমান্ডগুলি বোঝা একটি মৌলিক জ্ঞান সরবরাহ করে যা একটি IDE সহ যেকোনো ডিবাগার ব্যবহার করার আপনার ক্ষমতাকে উন্নত করে।
কার্যকর ডিবাগিংয়ের জন্য সর্বোত্তম অনুশীলন
কমান্ডগুলি জানার পাশাপাশি, ডিবাগিংয়ের জন্য একটি কাঠামোগত পদ্ধতি অবলম্বন করলে সমস্যা সমাধানে ব্যয় করা সময় নাটকীয়ভাবে হ্রাস পেতে পারে:
-
বাগটি নির্ভরযোগ্যভাবে পুনরুত্পাদন করুন: Pdb তে প্রবেশ করার আগে, নিশ্চিত করুন যে আপনার বাগটি ট্রিগার করার একটি সামঞ্জস্যপূর্ণ উপায় আছে। একটি অনির্ভরযোগ্য বাগ ঠিক করা সবচেয়ে কঠিন।
-
পরিধি সংকুচিত করুন:
pdb.set_trace()
বা প্রাথমিক ব্রেকপয়েন্ট ব্যবহার করে দ্রুত সেই সাধারণ এলাকায় যান যেখানে আপনি বাগটি আছে বলে সন্দেহ করেন। একটি বড় অ্যাপ্লিকেশনের একেবারে শুরু থেকে শুরু করবেন না যদি না প্রয়োজন হয়। -
অনুমান তৈরি করুন এবং পরীক্ষা করুন: ত্রুটি বার্তা বা অপ্রত্যাশিত আচরণের উপর ভিত্তি করে, কী ভুল হতে পারে সে সম্পর্কে একটি তত্ত্ব তৈরি করুন। ভেরিয়েবল পরীক্ষা করে বা নির্দিষ্ট যুক্তির মধ্য দিয়ে গিয়ে আপনার অনুমান প্রমাণ বা অপ্রমাণ করতে Pdb ব্যবহার করুন।
-
শর্তসাপেক্ষ ব্রেকপয়েন্ট বিজ্ঞতার সাথে ব্যবহার করুন: লুপ বা বহুবার কল করা ফাংশনগুলির জন্য, শর্তসাপেক্ষ ব্রেকপয়েন্ট অপ্রয়োজনীয় বিরতি প্রতিরোধ করে এবং নির্দিষ্ট সমস্যাযুক্ত পুনরাবৃত্তি বা কলের জন্য আপনার অনুসন্ধানকে ত্বরান্বিত করে।
-
একবারে খুব বেশি পরিবর্তন করবেন না: অবস্থা পরিবর্তন করতে
!
ব্যবহার করার সময়, ছোট, লক্ষ্যযুক্ত পরিবর্তন করুন। বড়, অসংগঠিত পরিবর্তন মূল সমস্যাকে অস্পষ্ট করতে পারে বা নতুন সমস্যা তৈরি করতে পারে। -
কল স্ট্যাক বুঝুন (
w
/bt
): আপনি কিভাবে কোডের বর্তমান লাইনে এসেছেন সে সম্পর্কে সর্বদা সচেতন থাকুন। কল স্ট্যাক গুরুত্বপূর্ণ প্রসঙ্গ সরবরাহ করে, বিশেষ করে বহু-স্তরযুক্ত অ্যাপ্লিকেশনগুলিতে। -
সোর্স কোড পড়ুন: Pdb আপনার কোডের এক্সিকিউশন বুঝতে সাহায্য করার একটি টুল, তবে এটি সম্পূর্ণরূপে যুক্তিটি পড়া এবং বোঝার বিকল্প নয়। আপনার বোঝাপড়া নিশ্চিত বা চ্যালেঞ্জ করতে Pdb ব্যবহার করুন।
-
নিয়মিত অনুশীলন করুন: ডিবাগিং একটি দক্ষতা। আপনি যত বেশি Pdb ব্যবহার করবেন এবং ইন্টারঅ্যাক্টিভ ডিবাগিংয়ে নিযুক্ত হবেন, তত বেশি স্বজ্ঞাত এবং দক্ষ হবেন।
উপসংহার: বিশ্বব্যাপী কোড মানের জন্য ইন্টারঅ্যাক্টিভ ডিবাগিং গ্রহণ করুন
Pdb ডিবাগার যেকোনো পাইথন ডেভেলপারের টুলকিটে একটি অপরিহার্য টুল, তাদের অবস্থান বা তাদের প্রকল্পের জটিলতা নির্বিশেষে। সাধারণ print()
স্টেটমেন্টের বাইরে গিয়ে Pdb এর সাথে ইন্টারঅ্যাক্টিভ ডিবাগিং গ্রহণ করলে আপনি আপনার প্রোগ্রামের এক্সিকিউশন সম্পর্কে গভীর অন্তর্দৃষ্টি অর্জন করতে, দ্রুত মূল কারণগুলি সনাক্ত করতে এবং আত্মবিশ্বাসের সাথে সমস্যাগুলি সমাধান করতে সক্ষম হন।
n
এবং s
এর মতো মৌলিক নেভিগেশন কমান্ড বোঝা থেকে শুরু করে, শর্তসাপেক্ষ ব্রেকপয়েন্ট এবং পোস্ট-মর্টেম বিশ্লেষণের মতো উন্নত কৌশল আয়ত্ত করা পর্যন্ত, Pdb শক্তিশালী সফটওয়্যার ডেভেলপমেন্টের জন্য প্রয়োজনীয় নিয়ন্ত্রণ এবং দৃশ্যমানতা প্রদান করে। আপনার দৈনন্দিন কার্যপ্রবাহে Pdb কে একীভূত করে এবং ডিবাগিংয়ের সর্বোত্তম অনুশীলনগুলি মেনে চলে, আপনি কেবল আপনার পাইথন অ্যাপ্লিকেশনগুলির গুণমান এবং নির্ভরযোগ্যতা উন্নত করবেন না, বরং আপনার নিজের কোড সম্পর্কে আপনার বোঝাপড়াও বাড়াবেন।
সুতরাং, পরের বার যখন আপনার পাইথন স্ক্রিপ্ট প্রত্যাশা অনুযায়ী আচরণ করবে না, তখন Pdb মনে রাখবেন। বাগ-মুক্ত কোডের অনুসন্ধানে এটি আপনার ইন্টারঅ্যাক্টিভ অংশীদার, যা ঐতিহ্যবাহী পদ্ধতিগুলি প্রায়শই ব্যর্থ হয় সেখানে স্পষ্টতা এবং নির্ভুলতা সরবরাহ করে। এটিকে আলিঙ্গন করুন, এটির সাথে অনুশীলন করুন এবং আপনার ডিবাগিং ক্ষমতাকে truly পেশাদার এবং বিশ্বব্যাপী মানদণ্ডে উন্নীত করুন।